﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Iacym.Entities;
using Iacym.BusinessLogic;
using Microsoft.Practices.Unity;

namespace Iacym.UI
{
    public partial class FrmMttoAsistencia : Form
    {
        [Dependency]
        public IAsistenciaBL asistenciaBL { get; set; }

        [Dependency]
        public IPersonaBL personaBL { get; set; }

        [Dependency]
        public IDetalleAsistenciaBL detalleBL { get; set; }

        [Dependency]
        public IEscuelaBL escuelaBL { get; set; }

        [Dependency]
        public ILibroBL libroBL { get; set; }

        public FrmMttoAsistencia()
        {
            InitializeComponent();
            this.BuildUp();
        }

        public ASISTENCIA currentasistencia
        {
            get { return aSISTENCIABindingSource.Current as ASISTENCIA; }
            set { aSISTENCIABindingSource.DataSource = value; }
        }

        List<ASISTENCIA> _lista = new List<ASISTENCIA>();
        bool isNew = true;

        public USUARIO currentUsuarioMttoAsistencia { get; set; }

        private void FrmMttoAsistencia_Load(object sender, EventArgs e)
        {
            
        }

        public void Nuevo()
        {
            isNew = true;
            aSISTENCIABindingSource.AddNew();
        }

        public void Editar(Int32 asistenciaId)
        {
            CBDiscipulado.Enabled = false;
            isNew = false;
            //currentasistencia.ESCUELA = escuelaBL.GetFromEscuelaById(currentasistencia.EscuelaId);
            //currentasistencia.LIBRO = libroBL.GetLibroById(currentasistencia.LibroId);
            //aSISTENCIABindingSource.DataSource = currentasistencia;
            var asistencia = asistenciaBL.GetAsistenciaById(asistenciaId);
            asistencia.LIBRO = libroBL.GetLibroById(asistencia.LibroId);
            asistencia.ESCUELA = escuelaBL.GetFromEscuelaById(asistencia.EscuelaId);
            asistencia.DETALLE_ASISTENCIA = detalleBL.GetAllFromDetalleAsistenciaByAsistenciaId(asistenciaId);

            var detalle = detalleBL.GetFromDetalleAsistenciaByAsistenciaId(asistenciaId);

            fechaDateTimePicker.Value = detalle.Fecha;
            aSISTENCIABindingSource.DataSource = asistencia;
            

            if (currentasistencia.FechaFin == null)
            {
                currentasistencia.FechaFin = currentasistencia.FechaInicio;
                fechaFinDateTimePicker.Enabled = true;
            }
            else
            {
                fechaFinDateTimePicker.Enabled = false;
            }
            fechaInicioDateTimePicker.Enabled = false;
            btnBuscarEscuela.Enabled = false;
            btnBuscarLibro.Enabled = false;
            dETALLE_ASISTENCIABindingSource1.ResetBindings(true);

            //var detalle = detalleBL.GetAllFromDetalleAsistenciaByAsistenciaId(currentasistencia.Id);
            //currentasistencia.DETALLE_ASISTENCIA = detalle;
            //currentasistencia.DETALLE_ASISTENCIA = null;
            //dETALLE_ASISTENCIABindingSource1.DataSource = detalle;            
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            var msg = "ERROR";
            ASISTENCIA current = aSISTENCIABindingSource.Current as ASISTENCIA;

            if (current != null)
            {
                if (isNew)
                {
                    try
                    {
                        current.FechaInicio = fechaInicioDateTimePicker.Value.Date;
                        if (fechaFinDateTimePicker.Value.Date == fechaInicioDateTimePicker.Value.Date)
                        {
                            current.FechaFin = null;
                        }
                        else
                        {
                            current.FechaFin = fechaFinDateTimePicker.Value.Date;
                        }
                        current.NroSesion = Convert.ToInt32(nroSesionNumericUpDown.Value.ToString());
                        current.Responsable = responsableTextBox.Text.ToUpper();
                        asistenciaBL.AddAsistencia(current);

                        MessageBox.Show("Registro Correcto.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    try
                    {
                        current.FechaInicio = fechaInicioDateTimePicker.Value.Date;
                        if (fechaFinDateTimePicker.Value.Date == fechaInicioDateTimePicker.Value.Date)
                        {
                            current.FechaFin = null;
                        }
                        else
                        {
                            current.FechaFin = fechaFinDateTimePicker.Value.Date;
                        }
                        current.NroSesion = Convert.ToInt32(nroSesionNumericUpDown.Value.ToString());
                        current.Responsable = responsableTextBox.Text.ToUpper();
                        asistenciaBL.UpdateAsistencia(current);
                        MessageBox.Show("Modificación Correcta.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }

        private void nroSesionTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsNumber(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void btnBuscarEscuela_Click(object sender, EventArgs e)
        {
            FrmEscuela frm = new FrmEscuela();
            frm.Extend();
            frm.currentUsuarioEscuela = currentUsuarioMttoAsistencia;
            frm.ShowDialog();
            if (frm.CurrentEscuela != null)
            {
                currentasistencia.ESCUELA = frm.CurrentEscuela;
                currentasistencia.EscuelaId = frm.CurrentEscuela.Id;
                aSISTENCIABindingSource.ResetBindings(true);
            }
        }

        private void btnBuscarLibro_Click(object sender, EventArgs e)
        {
            FrmLibro frm = new FrmLibro();
            frm.Extend();
            frm.currentUsuarioLibro = currentUsuarioMttoAsistencia;
            frm.ShowDialog();
            if (frm.CurrentLibro != null)
            {
                currentasistencia.LIBRO = frm.CurrentLibro;
                currentasistencia.LibroId = frm.CurrentLibro.Id;
                currentasistencia.NroSesion = frm.CurrentLibro.NroSesiones;
                //nroSesionTextBox.Text = frm.CurrentLibro.NroSesiones.ToString();
                aSISTENCIABindingSource.ResetBindings(true);
            }
        }

        private void BuscarPersona()
        {
            FrmPersona frm = new FrmPersona();
            frm.Extend();
            frm.currentUsuarioPersona = currentUsuarioMttoAsistencia;
            frm.ShowDialog();

            if (frm.CurrentPersona != null)
            {
                var detalle = new DETALLE_ASISTENCIA()
                {
                    PERSONA = frm.CurrentPersona,
                    PersonaId = frm.CurrentPersona.Id,
                    Fecha = fechaDateTimePicker.Value.Date,
                    AsistenciaId = currentasistencia.Id
                };

                var query = asistenciaBL.ValidarDuplicidadFecha(frm.CurrentPersona.Id, fechaDateTimePicker.Value.Date, currentasistencia.LibroId);

                if (!query)
                {
                    var existe = currentasistencia.DETALLE_ASISTENCIA.Where(p => p.PERSONA.Id.Equals(frm.CurrentPersona.Id)).SingleOrDefault();
                    if (existe == null)
                    {
                        currentasistencia.DETALLE_ASISTENCIA.Add(detalle);
                    }
                    else
                    {
                        MessageBox.Show("Persona ya agregada.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    
                }
                else
                {
                    MessageBox.Show("Persona ya cuenta con una asistencia." + "\n" + 
                        "Fecha: " + fechaDateTimePicker.Value.Date.ToShortDateString(), "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

                //aSISTENCIABindingSource.ResetBindings(true);
                dETALLE_ASISTENCIABindingSource1.ResetBindings(true);
            }
        }

        private void BtnCrear_Click(object sender, EventArgs e)
        {
            BuscarPersona();
        }

        private void FrmMttoAsistencia_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)
            {
                BuscarPersona();
            }
        }

        private void dETALLE_ASISTENCIADataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            ASISTENCIA _current = aSISTENCIABindingSource.Current as ASISTENCIA;
            DETALLE_ASISTENCIA _currentda = dETALLE_ASISTENCIABindingSource1.Current as DETALLE_ASISTENCIA;

            if (_current != null)
            {
                if (this.dETALLE_ASISTENCIADataGridView.Columns[e.ColumnIndex].Name.Equals("btnQuitar"))
                {
                    var rpt = MessageBox.Show("¿Seguro que desea quitarlo de la asistencia?", "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (rpt == DialogResult.Yes)
                    {
                        if (_currentda.PersonaId > 0)
                        {
                            detalleBL.DeleteDetalleAsistencia(_currentda.PersonaId, _current.Id);
                        }
                        dETALLE_ASISTENCIABindingSource1.RemoveCurrent();
                        aSISTENCIABindingSource.ResetBindings(true);
                        dETALLE_ASISTENCIABindingSource1.ResetBindings(true);
                    }
                }
            }
        }

        private void fechaDateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            //if (fechaInicioDateTimePicker.Value.Date == fechaFinDateTimePicker.Value.Date)
            //{
            //    if (fechaDateTimePicker.Value.Date < fechaInicioDateTimePicker.Value.Date)
            //    {
            //        MessageBox.Show("La fecha de asistencia no debe ser anterior a la fecha de inicio.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
            //        fechaDateTimePicker.ResetText();
            //    }
            //}
            //else
            //{
            //    if (fechaDateTimePicker.Value.Date < fechaInicioDateTimePicker.Value.Date)
            //    {
            //        MessageBox.Show("La fecha de asistencia no debe ser anterior a la fecha de inicio.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //        fechaDateTimePicker.ResetText();
            //    }
            //    else if (fechaDateTimePicker.Value.Date > fechaFinDateTimePicker.Value.Date)
            //    {
            //        MessageBox.Show("La fecha de asistencia no debe ser posterior a la fecha de término.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //        fechaDateTimePicker.ResetText();
            //    }
            //}
        }

        private void BtnExtPersona_Click(object sender, EventArgs e)
        {
            FrmPersona frm = new FrmPersona();
            frm.Extend();
            //frm.currentUsuarioPersona = currentUsuarioMttoUsuario;
            frm.ShowDialog();

            if (frm.CurrentPersona != null)
            {
                responsableTextBox.Text = frm.CurrentPersona.NombreCompleto;
                //aSISTENCIABindingSource.ResetBindings(true);
            }
        }

        private void CBDiscipulado_CheckedChanged(object sender, EventArgs e)
        {
            var currentasistencia = aSISTENCIABindingSource.Current as ASISTENCIA;
            if (isNew == true)
            {
                if (CBDiscipulado.Checked)
                {
                    
                    var persona = personaBL.GetFromPersonaByDiscipulador(2);

                    if (persona.Count > 0)
                    {
                        foreach (var item in persona)
                        {
                            var existe = currentasistencia.DETALLE_ASISTENCIA.Where(p => p.PERSONA.Id.Equals(item.Id)).SingleOrDefault();
                            if (existe == null)
                            {
                                var detalle = new DETALLE_ASISTENCIA()
                                {
                                    PERSONA = item,
                                    PersonaId = item.Id,
                                    Fecha = fechaDateTimePicker.Value.Date,
                                    AsistenciaId = currentasistencia.Id
                                };

                                currentasistencia.DETALLE_ASISTENCIA.Add(detalle);
                                aSISTENCIABindingSource.ResetBindings(true);
                            }
                            else
                            {
                                MessageBox.Show("Persona ya agregada.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }

                        }
                    }
                    else
                    {
                        MessageBox.Show("No tiene discipulos registrados", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }


                }
            }
        }
    }
}